/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package GUI;

import TeoriaDeColas.Engine;
import Tools.ConvertirTiempo;
import java.awt.HeadlessException;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import javax.swing.UnsupportedLookAndFeelException;

/**
 *
 * @author Karadak
 */
public class Informacion_Estadistica extends javax.swing.JFrame {

    /**
     * Creates new form Informacion_Estadistica
     */
    
    Engine simulador;               // clase personalizada que emula los pases de una simulacion
    double tasaLLegada = 0;         // velocidad con que llegan los clientes
    double tasaServicio = 0;        // velocidad con que atienden los servidores
    int numServidores = 0;          // cantidad de servidores en el sistema
    int longitudCola = 0;           // cpacidad de la cola
    double tiempo_simulacion = 0;   // por cuanto tiempo se simulara
             
    ConvertirTiempo change = new ConvertirTiempo(); // nos sirve para hacer conversiones de tiempos --> todo a segundos    
    ArrayList<Double> servers = new ArrayList();    // se almacena la tasa dellegada de los servidores >=1 
    
    
    public Informacion_Estadistica() {
        initComponents();
        setLocationRelativeTo(null) ;
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        L_tasa_llegada = new javax.swing.JLabel();
        tasa_llegada = new javax.swing.JTextField();
        L_Tasa_Servicio = new javax.swing.JLabel();
        Tasa_Servicio = new javax.swing.JTextField();
        tiempo_tasa_llegada = new javax.swing.JComboBox();
        Tiempo_Tasa_Servicio = new javax.swing.JComboBox();
        l_Servidores = new javax.swing.JLabel();
        l_cola = new javax.swing.JLabel();
        infinito = new javax.swing.JCheckBox();
        jLabel1 = new javax.swing.JLabel();
        Tiempo = new javax.swing.JTextField();
        tiempo_Sim = new javax.swing.JComboBox();
        cancelar = new javax.swing.JButton();
        Cola = new javax.swing.JSpinner();
        Servidores = new javax.swing.JSpinner();
        ok = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("sinXtendSim - Variables de Entrada");

        L_tasa_llegada.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        L_tasa_llegada.setText("λ: Tasa de Llegada ");

        L_Tasa_Servicio.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        L_Tasa_Servicio.setText("μ: Tasa de Servicio");

        tiempo_tasa_llegada.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Clientes/Segundo", "Clientes/Minutos", "Clientes/Hora" }));

        Tiempo_Tasa_Servicio.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Clientes/Segundo", "Clientes/Minutos", "Clientes/Hora" }));

        l_Servidores.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        l_Servidores.setText("k: Número de Servidores");

        l_cola.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        l_cola.setText("M: Longitud de Cola");

        infinito.setText("∞ : infinito");
        infinito.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                infinitoItemStateChanged(evt);
            }
        });

        jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        jLabel1.setText("Tiempo Simulación");

        tiempo_Sim.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Segundos", "Minutos", "Horas" }));

        cancelar.setText("Cancelar");

        Cola.setModel(new javax.swing.SpinnerNumberModel(Integer.valueOf(1), Integer.valueOf(1), null, Integer.valueOf(1)));

        Servidores.setModel(new javax.swing.SpinnerNumberModel(Integer.valueOf(1), Integer.valueOf(1), null, Integer.valueOf(1)));

        ok.setText("Aceptar");
        ok.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                okActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                        .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(l_cola, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(l_Servidores, javax.swing.GroupLayout.DEFAULT_SIZE, 177, Short.MAX_VALUE)
                        .addComponent(L_Tasa_Servicio, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(L_tasa_llegada, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                    .addComponent(cancelar, javax.swing.GroupLayout.PREFERRED_SIZE, 136, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(tasa_llegada)
                    .addComponent(Tasa_Servicio)
                    .addComponent(Tiempo)
                    .addComponent(Cola, javax.swing.GroupLayout.DEFAULT_SIZE, 131, Short.MAX_VALUE)
                    .addComponent(Servidores))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(ok, javax.swing.GroupLayout.DEFAULT_SIZE, 140, Short.MAX_VALUE)
                    .addComponent(tiempo_tasa_llegada, 0, 140, Short.MAX_VALUE)
                    .addComponent(Tiempo_Tasa_Servicio, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(infinito, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(tiempo_Sim, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap(80, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(20, 20, 20)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(L_tasa_llegada)
                    .addComponent(tasa_llegada, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(tiempo_tasa_llegada, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(L_Tasa_Servicio)
                    .addComponent(Tasa_Servicio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(Tiempo_Tasa_Servicio, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(l_Servidores)
                    .addComponent(Servidores, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(l_cola)
                    .addComponent(infinito)
                    .addComponent(Cola, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(Tiempo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(tiempo_Sim, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(34, 34, 34)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(cancelar)
                    .addComponent(ok))
                .addContainerGap(30, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

       
    /**
     * llena un array con las tasas de atencion correspondiente a cada servidor -  es la misma para todos
     */
    public void fill_Servers_uniform()
    {
        try
        {

            for(int i = 0; i< numServidores; i++)
            {
                this.servers.add(this.tasaServicio);;
            }
            
            System.out.println("# de servidores personalizados " + servers.size());            
            
        }
        catch(Exception er)
        {
            System.out.println("fill server error "+er);
        }
    }
    
    /**
     * controla si seleccionamos infinito o no la cola
     * @param evt 
     */
    private void infinitoItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_infinitoItemStateChanged
       if(this.infinito.isSelected())
       {
           Cola.setEnabled(false);           
       }
       else
       {
           Cola.setEnabled(true);
       }
    }//GEN-LAST:event_infinitoItemStateChanged

    /**
     * boton que acepta datos y procesa
     * @param evt 
     */
    private void okActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okActionPerformed
        
        try
        {
            // verificamos que las dimensionales de tiempo sean iguales
            if((this.tiempo_Sim.getSelectedIndex() == this.Tiempo_Tasa_Servicio.getSelectedIndex()) && (this.Tiempo_Tasa_Servicio.getSelectedIndex() == this.tiempo_tasa_llegada.getSelectedIndex()))
            {               
                // los datos son consistentes
                if (this.comprobar_datos()) // asigna datos y comprueba tipos
                {
                    
                    tiempo_simulacion = this.dim_time(this.tiempo_Sim.getSelectedIndex(), this.tiempo_simulacion); // a segundos
                    todoAsegundos(this.tiempo_Sim.getSelectedIndex()); // todo a segundos

                    System.out.println("λ = "+this.tasaLLegada);
                    System.out.println("μ = "+this.tasaServicio);
                    System.out.println("k = "+this.numServidores);
                    System.out.println("M = "+this.longitudCola);

                    fill_Servers_uniform();

                    System.out.println("Tiempo = "+ tiempo_simulacion + " seg");

                    // creamos sistema segun sea infinito o finito
                    if(!infinito.isSelected())
                    {
                        // sistema con cola finita
                        simulador = new Engine(this.numServidores, this.numServidores, this.servers, this.tasaLLegada);
                        System.out.println("S I S T E M A     F I N I T O ");
                        // creamos una ventana de simulacion
                        new XtendSimulador(simulador, tiempo_simulacion).setVisible(true);

                    }
                    else
                    {
                        //sistema con cola infinita
                        simulador = new Engine(this.numServidores, this.servers, this.tasaLLegada);
                        System.out.println("S I S T E M A     I N F I N I T O ");
                        // creamos una ventana de simulacion
                        new XtendSimulador(simulador, tiempo_simulacion).setVisible(true);
                    }
                }                               
            }
            else
            {
                JOptionPane.showMessageDialog(null, "Las dimensionales de tiempo deben ser iguales para la tasa de llegada, servicio y simulacion (seg. , Min. , Hr.)");
            }
            
            this.dispose();
           
        }
        catch (Exception er)
        {
            System.out.println("Error en aceptar "+er);
        }
    }//GEN-LAST:event_okActionPerformed

    /**
     * metodo que nos ayuda a convertir el tiempo a segundos
     * @param tipo 
     */
    public void todoAsegundos(int tipo)
    {
        try
        {
            System.out.println("TIPO "+tipo);
            switch(tipo)
            {
                case 1:
                    // minutos
                    
                    System.out.println("minutos a segundos");
                    this.tasaLLegada = tasaLLegada / this.change.minutosAsegundos(1);
                    this.tasaServicio = tasaServicio / this.change.minutosAsegundos(1);
                    break;
                case 2:
                    // horas
                    
                    System.out.println("horas a minutos");
                    this.tasaLLegada = tasaLLegada / this.change.horasAsegundos(1);
                    this.tasaServicio = tasaServicio / this.change.horasAsegundos(1);
                    break;
            }
            
        }
        catch(Exception er)
        {    
            System.out.println("Error en convertir todo a segundos "+er);
        }
    }
    
    
    /**
     * comprueba si es un dato numerico
     * @param dato
     * @return 
     */
    public boolean esNumero(String dato)
    {    
        boolean respuesta = false;
        try
        {            
            if (dato.length() <= 0) {respuesta = false;}
            else
            {
                Float.parseFloat(dato);
                respuesta = true;
            }              
        }
        catch (Exception er)
        {
            System.out.println("es numero: "+er);
        }
        
        return respuesta;
    }
    
    /**
     * devuelve un numero
     * @param dato
     * @return 
     */
    public Float GetNumero(String dato)
    {        
        try
        {       
                return Float.parseFloat(dato);
                        
        }
        catch (Exception er)
        {
            System.out.println("es numero: "+er);
        }
        return null;        
    }    
    
    
    /**
     * comprueba que los datos sean numericos y asigna a las variables correspondientes
     * @return 
     */
    public boolean comprobar_datos()
    {
        boolean correcto = false;
        try
        {
            // tasa de llegada
            if(this.esNumero(this.tasa_llegada.getText()))
            {
                tasaLLegada = this.GetNumero(this.tasa_llegada.getText());
                correcto = true;
            }
            else
            {
                JOptionPane.showMessageDialog(null, "La tasa de llegada debe ser numerico");
            }
            
            // tasa de Servicio
            if(this.esNumero(this.Tasa_Servicio.getText()))
            {
                tasaServicio= this.GetNumero(this.Tasa_Servicio.getText());
                correcto = true;
            }
            else
            {
                JOptionPane.showMessageDialog(null, "La tasa de Servicio debe ser numerico");
            }
            
            // Servidores
            numServidores = Integer.parseInt(Servidores.getValue().toString());
           
            // Longitud de cola
            if(this.infinito.isSelected())
            {
                // cola infinita

                correcto = true;
            }
            else
            {
                // numero finito
                longitudCola = Integer.parseInt(Cola.getValue().toString());   
                correcto = true;
                
            }
            
             // Tiempo Simulacion
            if(this.esNumero(this.Tiempo.getText()))
            {
                this.tiempo_simulacion = this.GetNumero(this.Tiempo.getText());
                correcto = true;
            }
            else
            {
                JOptionPane.showMessageDialog(null, "el tiempo de simulación debe ser numerico");         
                
            }          
        }
        catch (HeadlessException | NumberFormatException er)
        {
            System.out.println("Comprobar datos: "+er);
        }
        
        return correcto;
    }
    
    /**
     * dimensionales del tiempo de simulacion
     * @param dato
     * @return 
     */
    public double dim_time(int dato, double tiempo)
    {
                
        double salida = 0;
        
        switch(dato)
        {
            case 0:
                // segundos
                salida = tiempo;
                break;
            case 1:
                // minutos
                salida = change.minutosAsegundos(tiempo); // pasamos los 
                break;
            case 2:
                //horas
                salida = change.horasAsegundos(tiempo);
                break;                
        }
        
        return salida;
    }
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        try
        {
            
            javax.swing.UIManager.setLookAndFeel(javax.swing.UIManager.getSystemLookAndFeelClassName());


        }
        catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e)
        {
            System.out.println("ERROR en LOOK & FEEL"+e);
        }

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Informacion_Estadistica().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JSpinner Cola;
    private javax.swing.JLabel L_Tasa_Servicio;
    private javax.swing.JLabel L_tasa_llegada;
    private javax.swing.JSpinner Servidores;
    private javax.swing.JTextField Tasa_Servicio;
    private javax.swing.JTextField Tiempo;
    private javax.swing.JComboBox Tiempo_Tasa_Servicio;
    private javax.swing.JButton cancelar;
    private javax.swing.JCheckBox infinito;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel l_Servidores;
    private javax.swing.JLabel l_cola;
    private javax.swing.JButton ok;
    private javax.swing.JTextField tasa_llegada;
    private javax.swing.JComboBox tiempo_Sim;
    private javax.swing.JComboBox tiempo_tasa_llegada;
    // End of variables declaration//GEN-END:variables
}
